#include <iostream>  // 引入输入输出流库
#include <string>    // 引入字符串库

using namespace std;  // 使用标准命名空间

// 定义一个父类 person
class person
{
private:
    /* private成员，当前类中没有成员 */
public:
    string name;  // 公有成员变量，存储人的名字
    int id;       // 公有成员变量，存储人的ID
    int height;   // 公有成员变量，存储人的身高
public:
    // 构造函数，用于初始化 person 类的成员变量
    person(string name, int id, int height)
        : name(name), id(id), height(height)  // 使用初始化列表初始化成员变量
    {
        cout << "父类构造函数" << endl;  // 输出提示，表示父类构造函数被调用
    }
};

// 定义一个子类 man，继承自 person
class man : public person
{
private:
    string name;  // 子类 man 中的成员变量 name
public:
    // 构造函数，调用父类构造函数来初始化父类成员，并初始化子类成员
    man(string name, int id, int height)
        : person(name, id, height)  // 调用父类 person 的构造函数
    {
        // 注意：虽然 man 类中也有一个 name 成员，但它并没有被直接初始化
        //       因为 man 类继承了 person 类中的 name 成员，这里其实是调用了父类的构造函数。
    }
    
    // 成员函数，显示 person 类和 man 类的相关信息
    void show_date()
    {
        // 通过 person::name 来访问父类的 name 成员
        cout << person::name << " " << person::id << " " << this->height << endl;  
        // 注意这里 this->height 实际上访问的是父类的 height，因为 man 类继承自 person 类
    }
};

int main(int argc, char const *argv[])
{
    // 创建一个 man 类的对象 m，初始化时会调用父类构造函数
    man m("张三", 1, 131);

    cout << "hello world" << endl;  // 输出 "hello world"
    
    // 调用 man 类的 show_date 成员函数来输出数据
    m.show_date();  // 这将输出父类 person 的成员 name、id 和 height
    
    return 0;  // 程序正常结束
}
